#include "fsl_common.h"
#include "fsl_debug_console.h"

#include "fsl_gpio.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"

#define ILI9806E_PORT GPIO1  //res b0 dc b1

#define ILI9806E_SPI_CS  3
#define ILI9806E_SPI_SCK 0
#define ILI9806E_SPI_SDO 1
#define ILI9806E_SPI_SDI 2

#define DATA_COMMAND_PIN 19
#define ST7735_RESET	 18

void SoftSpiGpioInit(void);
void SckSetValue(bool value);
void MosiSetValue(bool value);
bool MisoGetValue(void);
void NssSetValue(bool value);

 
void Init_ILI9806E_SPI_Pin(void)
{
     gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
//     GPIO_PinInit(ILI9806E_PORT, ILI9806E_SPI_SCK, &led_config);
//     GPIO_PinInit(ILI9806E_PORT, ILI9806E_SPI_CS, &led_config);
//     GPIO_PinInit(ILI9806E_PORT, ILI9806E_SPI_SDI, &led_config);
     GPIO_PinInit(ILI9806E_PORT, DATA_COMMAND_PIN, &led_config);
	 GPIO_PinInit(ILI9806E_PORT, ST7735_RESET, &led_config);
//	 
//     led_config.direction = kGPIO_DigitalInput;
//     GPIO_PinInit(ILI9806E_PORT, ILI9806E_SPI_SDO, &led_config);
}

void SoftSpiGpioInit(void)
{
     Init_ILI9806E_SPI_Pin();
}

void SckSetValue(bool value)
{
     GPIO_PinWrite(ILI9806E_PORT,ILI9806E_SPI_SCK,value);
}

void MosiSetValue(bool value)
{
     GPIO_PinWrite(ILI9806E_PORT,ILI9806E_SPI_SDI,value);
}

void NssSetValue(bool value)
{
     GPIO_PinWrite(ILI9806E_PORT,ILI9806E_SPI_CS,value);
}

void ResetSetValue(bool value)
{
	GPIO_PinWrite(ILI9806E_PORT,ST7735_RESET,value);
}

void CommandSetValue(bool value)
{
	GPIO_PinWrite(ILI9806E_PORT,DATA_COMMAND_PIN,value);
}

void delay_1us(uint32_t us)
{
	SDK_DelayAtLeastUs(us, CLOCK_GetFreq(kCLOCK_CpuClk));
}

bool MisoGetValue(void)
{
     if(GPIO_PinRead(ILI9806E_PORT, ILI9806E_SPI_SDO) == 0)
     {
            return 0;
     }else{
            return 1;
     }
}

void delay_ms(uint32_t ms)
{
	SDK_DelayAtLeastUs(ms*1000, CLOCK_GetFreq(kCLOCK_CpuClk));
}

void IO_Tester(void)
{
	while(1)
	{
		SckSetValue(0);
		MosiSetValue(0);
		NssSetValue(0);
		ResetSetValue(0);
		CommandSetValue(0);
		
		delay_ms(1);
		
		SckSetValue(1);
		MosiSetValue(1);
		NssSetValue(1);
		ResetSetValue(1);
		CommandSetValue(1);
		delay_ms(1);
	}


}
